// 输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
		
// 示例 1：
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
// 输出：[1,2,3,6,9,8,7,4,5]

// 示例 2：
// 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
// 输出：[1,2,3,4,8,12,11,10,9,5,6,7]

// 限制：
// 0 <= matrix.length <= 100
// 0 <= matrix[i].length <= 100

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

// 从外到内遍历，遍历完一环就收缩一圈

var spiralOrder = function(matrix) {
    if (matrix.length === 0) return [];
    
    let top = 0,
        bottom = matrix.length - 1,
        left = 0,
        right = matrix[0].length - 1;
    
    let res = [];
    
    // 只剩一行
    if(top === bottom && left < right) {
        for(let i=left;i<=right;i++) res.push(matrix[left][i]);
    }
    // 只剩一列
    if(left === right && top < bottom) {
        for(let i=top;i<=bottom;i++){
            res.push(matrix[i][left]);
        }
    }
    // 只剩一项
    if(left === right && top === bottom) {
        res.push(matrix[left][top]);
    }
    
    while(top < bottom && left < right) {
        // 上层
        for(let i=left;i<right;i++) res.push(matrix[top][i]);
        // 右列
        for(let i=top;i<bottom;i++) res.push(matrix[i][right]);
        // 下层
        for(let i=right;i>left;i--) res.push(matrix[bottom][i]);
        // 左列
        for(let i=bottom;i>top;i--) res.push(matrix[i][left]);
        
        // 遍历完一圈,收缩,top++,bottom--,left++,right--;
        top++;
        bottom--;
        left++;
        right--;
        
        // 单独判断剩下的数据
        // 只剩一行
        if(top === bottom && left < right) {
            for(let i=left;i<=right;i++) res.push(matrix[left][i]);
        }
        // 只剩一列
        if(left === right && top < bottom) {
            for(let i=top;i<=bottom;i++) res.push(matrix[i][left]);
        }
        // 只剩一项
        if(left === right && top === bottom) {
            res.push(matrix[left][top]);
        }
    }
    
    return res;
};

console.log(spiralOrder([[3],[2]]))